home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_1 / infinate.2 < prev    next >
Internet Message Format  |  1995-03-23  |  6KB

  1. From comp.sys.handhelds Fri May 24 22:36:36 1991
  2. Path: seq!ecsgate!mcnc!gatech!ncar!elroy.jpl.nasa.gov!sdd.hp.com!spool.mu.edu!agate!usenet.ins.cwru.edu!ysub!psuvm!ims103
  3. From: IMS103@psuvm.psu.edu (Ian Matthew Smith)
  4. Newsgroups: comp.sys.handhelds
  5. Subject: HP48: Infinate Base Calc V1.2
  6. Message-ID: <91141.184410IMS103@psuvm.psu.edu>
  7. Date: 21 May 91 22:44:10 GMT
  8. Organization: Penn State University
  9. Lines: 210
  10.  
  11.  
  12.  This is version 1.2 of my infinate base calculator.  New in this
  13. version, it handles fractions.  As it stands, you will not notice
  14. any diffrence in the usage from V1.1 except for the displays on
  15. the [E] softkey in the custom menu.
  16.  
  17.  Ok, lets see if I can make this understandable...  By using
  18. binary numbers for my conversions, the range of the calculations
  19. is greatly increased.  Unfortunatly, you can't have fractions in
  20. binary numbers, so when you need to do fractional calculations,
  21. the IB programs will switch to decimal numbers when needed.
  22.  
  23. Leaving the IBFIX varable to 0 will keep rounding errors from
  24. happining in the conversion.  If you set it to somthing else,
  25. be warned that you will loose percision if you do an operation
  26. on 2 numbers under 1E12 that result in an answer over 1E12.
  27.  
  28. Thanks to Paul Dujmich <pauld@fs1.ece.cmu.edu> for providing
  29. me with an easy way to convert the fractional part of a number
  30. to a diffrent base, along with example code.
  31.  
  32. This directory contains:
  33.  
  34. BMTH  : Sets up the following custom menu...
  35.   Add, ect : The standard 4 math functions that work on IB numbers.
  36.   Base/Fix : Ok, this menu key has 2 numbers seperated by a slash.
  37.              the first is the base you are working in, and the
  38.              second is the number of desired fractional digits.
  39.              Pressing it will store the number in level one as
  40.              the current base.  Left-shifting will do the same,
  41.              but also convert the level 2 IB number to the current
  42.              base.  Right shifting it sets the number of fractional
  43.              digits to use in converting to IB numbers.
  44.   CONVERT  : Pressing this key will convert from an IB number to
  45.              a base-10 number, and back.  Left-shifting will toggle
  46.              between a binary number and a real.
  47. ->IB  : Take either a binary or a real from the stack and return
  48.         it in the base specified in BBASE, runded off to IBFIX
  49.         places.
  50. IB->  : Take an IB string from the stack and convert it to either
  51.         a binary number or a real.  if IBFIX is set to zero, it will
  52.         always return a binary number.  If IBFIX is set to somthing
  53.         other than zero, it will use return a real if the base-10
  54.         numver is less than 1E12.
  55. IB2-> : Runs IB-> on the objects in level 1 and two, leaving their
  56.         order intact.
  57. BBASE : The current base. (2-62 is valid)
  58. IBFIX : Number of desired decimal places. (0 will force all calculations
  59.                                            to be carried out in binaries)
  60. ->IB2 : Runs ->IB on the objects in level 1 and two, leaving their
  61.         order intact.
  62. BSTR  : A string used in the conversion proccess.
  63.  
  64.  - Ian Smith <<ims103@psuvm.psu.edu>>
  65.  
  66. Size: 1542 bytes
  67. CheckSum: # 76Fh
  68. ---------------------------- Cut Here --------------------------
  69. %%HP: T(3)A(R)F(.);
  70. DIR
  71.   BMTH
  72.     \<< { Add
  73.       \<< IB2\-> + \->IB
  74.       \>> } { Sub
  75.       \<< IB2\-> - \->IB
  76.       \>> } { Mul
  77.       \<< IB2\-> * \->IB
  78.       \>> } { Div
  79.       \<< IB2\-> / \->IB
  80.       \>> } BBASE "/"
  81. IBFIX + + {
  82.       \<< 'BBASE' STO
  83. BMTH
  84.       \>>
  85.       \<< SWAP IB\->
  86. SWAP 'BBASE' STO
  87. \->IB BMTH
  88.       \>>
  89.       \<< 'IBFIX' STO
  90. BMTH
  91.       \>> } 2 \->LIST {
  92. CONV {
  93.       \<< DUP
  94.         IF TYPE 2
  95. ==
  96.         THEN IB\->
  97.         ELSE \->IB
  98.         END
  99.       \>>
  100.       \<< DUP
  101.         IF TYPE 0
  102. ==
  103.         THEN R\->B
  104.         ELSE DUP
  105.           IF TYPE
  106. 10 ==
  107.           THEN B\->R
  108.           END
  109.         END
  110.       \>> } } 6 \->LIST
  111. TMENU
  112.     \>>
  113.   \->IB
  114.     \<< DUP
  115.       IF TYPE 0 ==
  116.       THEN DUP FP
  117. SWAP IP R\->B
  118.       ELSE 0 SWAP
  119.       END DUP
  120.       IF TYPE 10 ==
  121.       THEN RCWS
  122. SWAP "" SWAP 64
  123. STWS
  124.         WHILE DUP
  125. B\->R
  126.         REPEAT DUP
  127. BBASE DUP2 / * - 1
  128. + BSTR SWAP B\->R DUP
  129. SUB ROT + SWAP
  130. BBASE /
  131.         END DROP
  132. SWAP STWS SWAP
  133.         IF DUP
  134. BBASE IBFIX ^ * 1 <
  135.         THEN DROP
  136.         ELSE ""
  137. SWAP 1 IBFIX
  138.           START
  139.             IF DUP
  140. 0 \=/
  141.             THEN
  142. BBASE * DUP IP BSTR
  143. SWAP 1 + DUP SUB
  144. ROT SWAP + SWAP FP
  145.             END
  146.           NEXT DROP
  147. "." SWAP + +
  148.         END
  149.       END
  150.     \>>
  151.   IB\->
  152.     \<< DUP
  153.       IF TYPE 2 ==
  154.       THEN RCWS
  155. SWAP 64 STWS
  156.         IF DUP "."
  157. POS
  158.         THEN DUP
  159. DUP "." POS SWAP
  160. DUP SIZE ROT 1 +
  161. SWAP SUB SWAP DUP
  162. "." POS 1 - 1 SWAP
  163. SUB
  164.         ELSE ""
  165. SWAP
  166.         END # 0d
  167. SWAP DUP SIZE 1 - 0
  168. SWAP
  169.         FOR j DUP
  170. DUP SIZE j - DUP
  171. SUB BSTR SWAP POS 1
  172. - # 1d
  173.           IF j 0 >
  174.           THEN
  175. BBASE 1 j
  176.             START
  177. DUP ROT * SWAP
  178.             NEXT
  179. DROP
  180.           END * ROT
  181. + SWAP
  182.         NEXT DROP
  183.         IF DUP B\->R
  184. 1.E12 < IBFIX AND
  185.         THEN B\->R
  186.         END SWAP
  187.         IF DUP SIZE
  188.         THEN 0 SWAP
  189. DUP SIZE 1 SWAP
  190.           FOR j DUP
  191. j j SUB BSTR SWAP
  192. POS 1 - BBASE j NEG
  193. ^ * ROT + SWAP
  194.           NEXT DROP
  195. +
  196.         ELSE DROP
  197.         END SWAP
  198. STWS
  199.       ELSE
  200.         IF DUP TYPE
  201. 0 == IBFIX NOT AND
  202.         THEN R\->B
  203.         END
  204.       END
  205.     \>>
  206.   IB2\->
  207.     \<< IB\-> SWAP IB\->
  208. SWAP
  209.     \>>
  210.   BBASE 16
  211.   IBFIX 0
  212.   \->IB2
  213.     \<< \->IB SWAP \->IB
  214. SWAP
  215.     \>>
  216.   BSTR
  217. "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  218. END
  219. ---------------------------- Cut Here --------------------------
  220.  - Ian Smith <<ims103@psuvm.psu.edu>>
  221.  
  222.